package com.jwsoft.manager.core.dao.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jwsoft.manager.common.vo.eduAddressSchoolAudit.EduAddressSchoolAuditVO;
import com.jwsoft.manager.common.vo.eduAddressTree.AddressTreeVO;
import com.jwsoft.manager.common.vo.eduAddressTree.AddressVO;
import com.jwsoft.manager.common.vo.eduAddressTreeInitial.EduAddressTreeInitialVO;
import com.jwsoft.manager.common.vo.eduAddressTreeSchool.EduAddressTreeSchoolRemoveVO;
import com.jwsoft.manager.common.vo.eduAddressTreeSchool.EduAddressTreeSchoolVO;
import com.jwsoft.manager.common.vo.eduSchool.EduSchoolVO;
import com.jwsoft.manager.core.dao.model.EduAddressTree;
import com.jwsoft.manager.core.dao.model.EduAddressTreeSchool;

import java.util.Collection;
import java.util.List;

/**
 * 地址树与学校关联表服务类
 *
 * @author fangs
 * @since 2023-02-24
 */
public interface EduAddressTreeSchoolService extends IService<EduAddressTreeSchool> {

    /**
     * 保存地址树节点和学校的关联关系
     *
     * @param addressChain 地址链
     * @param eduSchool    学校信息
     * @author fangs
     */
    void saveTreeAndSchool(List<AddressTreeVO> addressChain, EduSchoolVO eduSchool);


    /**
     * 保存单个地址树节点和学校的关联关系
     *
     * @param addressTreeVO 单个地址树节点
     * @param eduSchool     学校信息
     * @author fangs
     */
    EduAddressTreeSchoolVO saveTreeAndSchool(AddressTreeVO addressTreeVO, EduSchoolVO eduSchool, Integer boundNextNum, Integer boundLeafNum);

    /**
     * 保存单个地址树节点和学校的关联关系
     *
     * @param treeId       地址树节点id
     * @param schoolId     学校id
     * @param boundNextNum 绑定下级数量
     * @param boundLeafNum 绑定叶子数量
     * @return 地址树节点和学校的关联关系信息
     * @author fangs
     */
    EduAddressTreeSchoolVO saveTreeAndSchool(Long treeId, String schoolId, Integer boundNextNum, Integer boundLeafNum);

    /**
     * 删除关联数据
     *
     * @param vo
     */
    void removeSchoolRelation(EduAddressTreeSchoolRemoveVO vo);

    /**
     * 地址树节点匹配学校
     *
     * @param schoolCategory 需要匹配的学段
     * @param addressVO      需要匹配的地址信息
     * @return 匹配到的学校
     * @author fangs
     */
    List<EduSchoolVO> matchSchool(String schoolCategory, AddressVO addressVO);


    /**
     * 地址树节点匹配学校
     *
     * @param schoolCategory 需要匹配的学段
     * @param addressVO      需要匹配的地址信息
     * @return 匹配到的学校-地址树节点关联
     * @author fangs
     */
    List<EduAddressTreeSchool> matchSchool2(String schoolCategory, AddressVO addressVO);

    /**
     * 根据学校id获取学校能显示的 town列表
     * @param orgId
     * @return
     */
    List<Long> getSchoolInToWnList(String orgId);

    /**
     * 修正（节点-学校）关联的下级关联数和叶子关联数
     *
     * @param addressTreeVO 关联的地址树节点
     * @param schoolVO      关联的学校
     * @author fangs
     */
    void reviseSchoolNum(AddressTreeVO addressTreeVO, EduSchoolVO schoolVO);

    boolean removeByTreeId(Collection<Long> treeIds);

    /**
     * 地址树节点匹配学校
     *
     * @param schoolCategory 需要匹配的学段
     * @param parseNodes     解析的地址节点
     * @return 匹配到的学校
     * @author zhiyuan
     */
    List<EduSchoolVO> addressMatchSchool(String schoolCategory, List<EduAddressTreeInitialVO> parseNodes);

    List<EduSchoolVO> addressMatchSchoolByTreeLink(String schoolCategory, List<EduAddressTree> treeLinks);

    /**
     * 删除地址树 和 学校关联关系
     * @param schoolId  学校主键
     * @param treeNodes 地址树链路信息
     */
    void removeSchoolAndAddressTreeRelation(String schoolId, List<EduAddressTree> treeNodes);

    /**
     * 批量删除地址树 和 学校关联关系
     * @param linkByTreeId
     * @param schoolIds
     */
    void removeSchoolsAndAddressTreeRelation( List<String> schoolIds,List<EduAddressTree> linkByTreeId);

    /**
     * 审核不通过，删除地址叶子节点关联学校  2.判断上级节点是否能删。
     * @param auditVO
     */
    void removeAddressTreeNodeRelationSchool(EduAddressSchoolAuditVO auditVO);
}
